/**
* SUMO和three.js之间的坐标转换。
* 相扑使用一个坐标系统，地面是xy平面，z指向上。
* x值从左到右增加，y值从上到下增加。

这是一个左手坐标系。

* 在three.js中，地面是xz平面，y点向上。
top - y 原点在左上角变为左下角
* 为了在这些系统之间转换，我们反转y (y——> top - y)并交换
* y和z坐标。我们使用(bottom -y)而不是(-y)来保持坐标为正。
*/

import * as proj4 from 'proj4';


export function getTransforms(network) {
  const location = network.net.location;
  const [dx, dy] = location.netOffset.split(',').map(Number);
  const [left, top, right, bottom] = location.convBoundary.split(',').map(Number);
  const {projParameter} = location;

  const t = {
    left,
    top,
    bottom,
    right,
    xyToXz([x, y]) {
      return [x, top - y];
    },
    xyToXyz([x, y, z = 0]) {
      return [x, z, top - y];
    },
    center() {
      return [(right - left) / 2, (bottom - top) / 2];
    },
    width() {
      return Math.abs(right - left);
    },
    height() {
      return Math.abs(bottom - top);
    },
    sumoXyzToXyz([x, y, z]) {
      const [xp, , zp] = this.xyToXyz([x, y]);
      return [xp, z, zp];
    },
    xzToSumoXy([x, z]) {
      return [x, top - z];
    },
    latLngToXZ(latLng) {
      if (projParameter === '!') return null;
      const [x, y] = proj4(projParameter).forward([latLng.lng, latLng.lat]);
      return this.xyToXz([x + dx, y + dy]);
    },
    toLatLng(xz) {
      if (projParameter === '!') return null;
      // First convert back to SUMO coordinates.
      const [sumoX, sumoY] = t.xzToSumoXy(xz);
      const projX = sumoX - dx;
      const projY = sumoY - dy;

      const [lng, lat] = proj4(projParameter).inverse([projX, projY]);
      return {lat, lng};
    },
  };
  return t;
}
